package com.gitee.minimalismstyle.fresh.common.swagger.config

import org.springframework.boot.context.properties.ConfigurationProperties
import springfox.documentation.service.AuthorizationScope

@ConfigurationProperties(prefix = "fresh.swagger")
class SwaggerProperties {
    /**
     * 是否开启swagger
     */
    var enabled: Boolean? = null

    /**
     * 标题
     */
    var title = ""

    /**
     * 描述
     */
    var description = ""

    /**
     * 版本
     */
    var version = ""

    /**
     * 许可证
     */
    var license = ""

    /**
     * 许可证URL
     */
    var licenseUrl = ""

    /**
     * 服务条款URL
     */
    var termsOfServiceUrl = ""

    /**
     * 忽略的参数类型
     */
    var ignoredParameterTypes: List<Class<*>> = ArrayList()
    var contact = Contact()

    /**
     * swagger会解析的包路径
     */
    var basePackage = ""

    /**
     * swagger会解析的url规则
     */
    var basePath: MutableList<String> = mutableListOf()

    /**
     * 在basePath基础上需要排除的url规则
     */
    var excludePath: List<String> = mutableListOf()

    /**
     * 分组文档
     */
    var docket: Map<String, DocketInfo> = LinkedHashMap()

    /**
     * host信息
     */
    var host = ""

    /**
     * 全局参数配置
     */
    var globalOperationParameters: List<GlobalOperationParameter>? = null


    /**
     * 是否使用默认预定义的响应消息 ，默认 true
     */
    var applyDefaultResponseMessages = true

    /**
     * 全局响应消息
     */
    var globalResponseMessage: GlobalResponseMessage? = null

    /**
     * 全局统一鉴权配置
     */
    var authorization = Authorization()

    class GlobalOperationParameter {
        /**
         * 参数名
         */
        var name: String? = null

        /**
         * 描述信息
         */
        var description: String? = null

        /**
         * 指定参数类型
         */
        var modelRef: String? = null

        /**
         * 参数放在哪个地方:header,query,path,body.form
         */
        var parameterType: String? = null

        /**
         * 参数是否必须传
         */
        var required: Boolean = false
    }

    class DocketInfo {
        /**
         * 标题
         */
        var title = ""

        /**
         * 描述
         */
        var description = ""

        /**
         * 版本
         */
        var version = ""

        /**
         * 许可证
         */
        var license = ""

        /**
         * 许可证URL
         */
        var licenseUrl = ""

        /**
         * 服务条款URL
         */
        var termsOfServiceUrl = ""
        var contact = Contact()

        /**
         * swagger会解析的包路径
         */
        var basePackage = ""

        /**
         * swagger会解析的url规则
         */
        var basePath: List<String> = ArrayList()

        /**
         * 在basePath基础上需要排除的url规则
         */
        var excludePath: List<String> = ArrayList()
        var globalOperationParameters: List<GlobalOperationParameter>? = null

        /**
         * 忽略的参数类型
         */
        var ignoredParameterTypes: List<Class<*>> = ArrayList()
    }

    class Contact {
        /**
         * 联系人
         */
        var name = ""

        /**
         * 联系人url
         */
        var url = ""

        /**
         * 联系人email
         */
        var email = ""
    }

    class GlobalResponseMessage {
        /**
         * POST 响应消息体
         */
        var post: List<GlobalResponseMessageBody> = ArrayList()

        /**
         * GET 响应消息体
         */
        var get: List<GlobalResponseMessageBody> = ArrayList()

        /**
         * PUT 响应消息体
         */
        var put: List<GlobalResponseMessageBody> = ArrayList()

        /**
         * PATCH 响应消息体
         */
        var patch: List<GlobalResponseMessageBody> = ArrayList()

        /**
         * DELETE 响应消息体
         */
        var delete: List<GlobalResponseMessageBody> = ArrayList()

        /**
         * HEAD 响应消息体
         */
        var head: List<GlobalResponseMessageBody> = ArrayList()

        /**
         * OPTIONS 响应消息体
         */
        var options: List<GlobalResponseMessageBody> = ArrayList()

        /**
         * TRACE 响应消息体
         */
        var trace: List<GlobalResponseMessageBody> = ArrayList()
    }

    class GlobalResponseMessageBody {
        /**
         * 响应码
         */
        var code = 0

        /**
         * 响应消息
         */
        var message: String? = null

        /**
         * 响应体
         */
        var modelRef: String? = null
    }

    /**
     * securitySchemes 支持方式之一 ApiKey
     */
    class Authorization {
        /**
         * 鉴权策略ID，对应 SecurityReferences ID
         */
        var name = "Authorization"

        /**
         * 鉴权策略，可选 ApiKey | BasicAuth | None，默认ApiKey
         */
        var type = "ApiKey"

        /**
         * 鉴权传递的Header参数
         */
        var keyName = "TOKEN"

        /**
         * 需要开启鉴权URL的正则
         */
        var authRegex = "^.*$"

        /**
         * 鉴权作用域列表
         */
        var authorizationScopeList: MutableList<AuthorizationScope> = mutableListOf()
    }
}